package cn.edu.dgut.sai;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Hello world!
 */
public class App {
    public static void main(String[] args) {
        System.out.println("Spring,Hello World!");

        // 创建Spring Application Context--spring应用程序上下文，即Spring容器。
        // 注意：ClassPathXmlApplicationContext，顾名思义，它是通过读取xml文件来装配Bean的。
        // 如果是通过Java Config装配Bean，则是使用AnnotationConfigApplicationContext。
        // ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        ApplicationContext context1 = new ClassPathXmlApplicationContext("applicationContext.xml");
        // scan会扫描指定包和它的所有子包，可以添加多个包名作为参数。
        // context.scan("cn.edu.dgut.sai");

        System.out.println(context1.getBean("customerBean"));

        // 动态注册Bean
        context.registerBean("playerBean", Player.class);
        context.registerBean("userBean", User.class);

        // 扫描指定包后，必需调用refresh()刷新spring容器，refresh方法会执行很多工作，具体看refresh()的源码，在这里暂时解理为重新装配扫描包后得到的Bean。
        // 只能执行refresh()一次
        // context.refresh();

//        Player player = (Player) context.getBean("playerBean");
//        System.out.println(player);

        User user = (User) context.getBean("userBean");
        System.out.println(user);

        // 通过Bean的名字name, 调用context.getBean方法从Spring容器中获取这个Bean。
        Customer customerBean = (Customer) context.getBean("customerBean");

        System.out.println(customerBean);
        customerBean.displayInfo();

        // 调用close方法，关闭Spring容器，删除所有Bean。
        context.close();
    }
}
